package com.itheima.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    /**
     *
     * @author :速趴赛亚锦======================【拦截器的使用 三个点位，config里面一个interceptor里面两个】
     * @create :2024/03/18 16:12
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 实现登录的校验
//        return true;//放行
//        return false;//不放行
        //:获取 请求路径
//        String url = request.getRequestURL().toString();
        //:判断是否包含login --可以省略 我不拦截login
        //1:获取令牌  通过请求头获取
        String token = request.getHeader("token");
        log.info("获取到的token:"+token);
        // 2：判断令牌 是否存在 不存在 返回错误结果
        if(token==null || token.length()==0){
            log.info("token不存在");
            //创建响应结果对象
            Result result = Result.error("NOT_LOGIN");
            //转换成json
            String json = JSONObject.toJSONString(result);
            /// 设置写的数据的 类型
            response.setContentType("application/json;charset=utf-8");
            //写到流中
            response.getWriter().write(json);
            return false;//没有通过
        }
        //3: 进行令牌校验  有异常说明 失败 返回错误结果
        try{
            JwtUtils.parseJWT(token);
        }catch (Exception e){
            //有异常 说明没通过
            log.info("token验证没有通过");
            //创建响应结果对象
            Result result = Result.error("NOT_LOGIN");
            //转换成json
            String json = JSONObject.toJSONString(result);
            /// 设置写的数据的 类型
            response.setContentType("application/json;charset=utf-8");
            //写到流中
            response.getWriter().write(json);
            return false;//没有通过
        }
        //4:最后完成放行
        return true;
    }
}
